<!DOCTYPE html>



  


<html class="theme-next pisces use-motion" lang="zh-Hans">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta name="theme-color" content="#222">
<meta name="referrer" content="same-origin">
<meta name="referrer" content="no-referrer" />








<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
















  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />







<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.1.4" rel="stylesheet" type="text/css" />


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=5.1.4">


  <link rel="mask-icon" href="/images/logo.svg?v=5.1.4" color="#222">





  <meta name="keywords" content="分布式," />










<meta name="description" content="&amp;emsp;&amp;emsp;在讲共识算法的时候，我想先讨论一下一致性。因为我很长时间没有理解一致性（Consistency）和共识（Consensus）的区别，或者说，我一度以为他俩是一回事。 一致性&amp;emsp;&amp;emsp;在分布式系统中，通常一个服务会运行在多个节点上，如何保证多个节点对外呈现出同一个状态，就是分布式一致性需要探讨的话题。一致性的侧重点，在于节点之间的数据可见性约束，它实质上是一个副">
<meta name="keywords" content="分布式">
<meta property="og:type" content="article">
<meta property="og:title" content="分布式共识算法之Paxos">
<meta property="og:url" content="http://yoursite.com/2019/06/24/分布式共识算法之Paxos/index.html">
<meta property="og:site_name" content="矩阵编程">
<meta property="og:description" content="&amp;emsp;&amp;emsp;在讲共识算法的时候，我想先讨论一下一致性。因为我很长时间没有理解一致性（Consistency）和共识（Consensus）的区别，或者说，我一度以为他俩是一回事。 一致性&amp;emsp;&amp;emsp;在分布式系统中，通常一个服务会运行在多个节点上，如何保证多个节点对外呈现出同一个状态，就是分布式一致性需要探讨的话题。一致性的侧重点，在于节点之间的数据可见性约束，它实质上是一个副">
<meta property="og:locale" content="zh-Hans">
<meta property="og:image" content="http://ww1.sinaimg.cn/large/639cfad5gy1g4azkh3ys5j20ts0cqn1q.jpg">
<meta property="og:updated_time" content="2019-10-24T16:22:00.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="分布式共识算法之Paxos">
<meta name="twitter:description" content="&amp;emsp;&amp;emsp;在讲共识算法的时候，我想先讨论一下一致性。因为我很长时间没有理解一致性（Consistency）和共识（Consensus）的区别，或者说，我一度以为他俩是一回事。 一致性&amp;emsp;&amp;emsp;在分布式系统中，通常一个服务会运行在多个节点上，如何保证多个节点对外呈现出同一个状态，就是分布式一致性需要探讨的话题。一致性的侧重点，在于节点之间的数据可见性约束，它实质上是一个副">
<meta name="twitter:image" content="http://ww1.sinaimg.cn/large/639cfad5gy1g4azkh3ys5j20ts0cqn1q.jpg">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Pisces',
    version: '5.1.4',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://yoursite.com/2019/06/24/分布式共识算法之Paxos/"/>





  <title>分布式共识算法之Paxos | 矩阵编程</title>
  





  <script type="text/javascript">
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?7d29e6fba8e07d1a8af2414a20e5f2a6";
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(hm, s);
    })();
  </script>




</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/"  class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">矩阵编程</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle"></p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-主页">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-主页"></i> <br />
            
            主页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-分类"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-所有文章">
          <a href="/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-文章"></i> <br />
            
            所有文章
          </a>
        </li>
      

      
    </ul>
  

  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://yoursite.com/2019/06/24/分布式共识算法之Paxos/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="matrix">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="矩阵编程">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">分布式共识算法之Paxos</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2019-06-24T09:30:16+08:00">
                2019-06-24
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/分布式/" itemprop="url" rel="index">
                    <span itemprop="name">分布式</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <span class="post-meta-item-icon">
                  <i class="fa fa-comment-o"></i>
                </span>
                <a href="/2019/06/24/分布式共识算法之Paxos/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count disqus-comment-count"
                        data-disqus-identifier="2019/06/24/分布式共识算法之Paxos/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <p>&emsp;&emsp;在讲共识算法的时候，我想先讨论一下一致性。因为我很长时间没有理解一致性（Consistency）和共识（Consensus）的区别，或者说，我一度以为他俩是一回事。</p>
<h3 id="一致性"><a href="#一致性" class="headerlink" title="一致性"></a>一致性</h3><p>&emsp;&emsp;在分布式系统中，通常一个服务会运行在多个节点上，如何保证多个节点对外呈现出同一个状态，就是分布式一致性需要探讨的话题。一致性的侧重点，在于节点之间的数据可见性约束，它实质上是一个副本（Replication）问题，对于同一个数据的多个副本，其对外表现出的数据一致性。一致性并不是分布式系统中独有的概念，在最早期的单机时代，一致性问题就已经显现了，在<a href="https://es.cs.uni-kl.de/publications/datarsg/Senf13.pdf" target="_blank" rel="noopener">《Operational Characterization of Weak Memory Consistency Models》</a>这篇论文中，可以看到十几种关于弱内存一致性模型的分类描述。当然我们这里不会逐一进行探讨，下面我只列举几种常见的分布式一致性模型进行说明：<br><a id="more"></a></p>
<ul>
<li><strong>严格一致性（Strict Consistency）</strong> 最强大的一致性模型，任何对数据的写操作都能立即同步到其他进程，任何对数据的读操作都能读到最新的修改值。这是一种理想化的模型，试想两台服务器之间的数据同步，不可避免地会有传输延迟。</li>
<li><strong>强一致（Strong Consistency）</strong> 又称之为原子一致性（Atomic Consistency）或者可线性化（Linearizability），单机模式下最强的一致性模型。通俗地来解释，线性一致性的基本的想法是让一个系统看起来好像只有一个数据副本，而且所有的操作都是原子性的。有了这个保证，即使实际中可能有多个副本，应用也不需要担心系统返回不一致的结果。</li>
<li><strong>顺序一致（Sequential Consistency）</strong> 保证整个事件历史在各个进程上看全局一致, 第二是单个进程的事件历史在全局历史上符合程序顺序。</li>
<li><strong>弱一致性（Weak Consistency）</strong> 数据写入之后不保证其他线程或者进程能立即读到，也无法保证具体多久能读到，但是会尽可能保证在某个时间内，可以让数据达到一致性状态。</li>
<li><strong>最终一致性（Eventual Consistency）</strong> 弱一致性的一种特殊形式，也是业界比较推崇的一种一致性模型。系统会保证在一定时间内，能够达到数据一致的状态。这个时间点由不同的系统、不同的业务去衡量，在最终一致性完成之前，有可能返回任何的值。BASE理论中的E就是最终一致性。</li>
</ul>
<p><strong>上面的概括可能对一致性模型解释的不是很清楚，如果想要深入了解，可以看看下面的文章</strong>：</p>
<blockquote>
<p><a href="https://danielw.cn/history-of-distributed-systems-1" target="_blank" rel="noopener">《分布式系统一致性的发展历史 (一)》</a><br><a href="https://zhuanlan.zhihu.com/p/42239873" target="_blank" rel="noopener">《线性一致性：什么是线性一致性？》</a><br><a href="https://mingx01.github.io/zh/yi-zhi-xing-mo-xing-consistency-modelxiao-jie.html" target="_blank" rel="noopener">《一致性模型（Consistency Model）小结》</a><br><a href="http://coldattic.info/post/88/" target="_blank" rel="noopener">《Consistency Models Explained Briefly》</a><br><a href="https://en.wikipedia.org/wiki/Consistency_model#Sequential_consistency" target="_blank" rel="noopener">《Consistency model》</a><br><a href="https://es.cs.uni-kl.de/publications/datarsg/Senf13.pdf" target="_blank" rel="noopener">《Operational Characterization of Weak Memory Consistency Models》</a></p>
</blockquote>
<h3 id="共识"><a href="#共识" class="headerlink" title="共识"></a>共识</h3><p>&emsp;&emsp;分布式系统中通常会遇到节点服务器宕机，网络异常如消息延时、丢失、乱序或者网络分区的情况（不考虑拜占庭错误），如何在多个节点之间，彼此对某个提议（propose）达成一致的结果，就是共识算法需要考虑的事情。在上面诸多不可预期的异常下，为了保证我们的业务还能够正常进行，在分布式算法的设计中，需要考虑以下两个特性：</p>
<ul>
<li>Safety 系统不会进入非预期的状态。（something “bad” will never happen）</li>
<li>Liveness 预期的状态一定会到达。（something “good” will must happen (but we don’t know when)）</li>
</ul>
<h3 id="Paxos"><a href="#Paxos" class="headerlink" title="Paxos"></a>Paxos</h3><p>&emsp;&emsp;Paxos算法是莱斯利·兰伯特（Leslie Lamport）于1990年提出的一种基于消息传递的共识算法，并于1998年在论文<a href="https://www.microsoft.com/en-us/research/uploads/prod/2016/12/The-Part-Time-Parliament.pdf" target="_blank" rel="noopener">《The Part-Time Parliament》</a>中以一个希腊小岛Paxos作为比喻详细描述了算法决议的过程。 但不幸的是这个故事好像并没有让大多数人明白Paxos算法，所以后来他又写了一篇<a href="https://www.microsoft.com/en-us/research/uploads/prod/2016/12/paxos-simple-Copy.pdf" target="_blank" rel="noopener">《Paxos Made Simple》</a>：</p>
<blockquote>
<p><strong>The Paxos algorithm, when presented in plain English, is very simple.</strong></p>
</blockquote>
<p>在《Paxos Made Simple》中，Leslie Lamport同样对分布式共识算法关于Safety和Liveness的定义进行了说明：<br><strong>Safety：</strong></p>
<ul>
<li>仅有一个被提议的值可以被选中，（Only a value that has been proposed may be chosen,）</li>
<li>仅有一个值被选中，且（Only a single value is chosen, and）</li>
<li>一个进程仅能学习到最终被决议的值。（A process never learns that a value has been chosen unless it actually has been.）</li>
</ul>
<p><strong>Liveness：</strong></p>
<ul>
<li>保证某些被提议的值最终能够被选中，且，如果一个值被选中，那么一个进程最终能够学到这个被选中的值</li>
</ul>
<h4 id="角色"><a href="#角色" class="headerlink" title="角色"></a>角色</h4><p>&emsp;&emsp;Paxos算法中有三种角色，分别为：提议者（Proposer）、决策者（Acceptor）、学习者（Learner）：</p>
<ul>
<li><strong>提议者</strong> 选择一个自增且全局唯一的编号（Proposal ID），向超过半数的决策者（Acceptor）提出提案（proposal）。</li>
<li><strong>决策者</strong> 决定提案是否通过，如果提案获得超过半数的决策者通过，那么该提案就获得共识达成一致。</li>
<li><strong>学习者</strong> 学习该达成一致的提案。</li>
</ul>
<p>&emsp;&emsp;从上面来看，Paxos共识存在一个前提，必须要获得半数以上的决策者通过，即在一个总共有2F+1个节点（奇数个节点）的Paxos集群中，可以容忍最多不超过F个节点同时发生故障。</p>
<h4 id="三阶段"><a href="#三阶段" class="headerlink" title="三阶段"></a>三阶段</h4><p>&emsp;&emsp;整个Paxos算法分为三个阶段，分别为：</p>
<ol>
<li><strong>Prepare阶段</strong> 提议者（Proposer）携带编号（Proposal ID）向集群中的所有决策者（Acceptor）发起Prepare请求，决策者（Acceptor）收到请求后作出承诺应答（Promise）。编号（Proposal ID）可以由机器号和时间戳组成全局唯一的自增序列，本阶段无需携带具体提案内容（Proposal Value）。本阶段决策者（Acceptor）会作出以下<strong>承诺</strong>：<ul>
<li><strong>应答他收到的第一个Prepare Request。</strong></li>
<li><strong>不再应答编号（Proposal ID）小于当前请求的其它Prepare Request。</strong></li>
<li><strong>如果已经接受（Accepet）了其他的提案（Proposal Value），返回编号（Proposal ID）最大的那个提案（Proposal Value）。</strong></li>
</ul>
</li>
<li><strong>Accept阶段</strong> 如果提议者（Proposer）收到超半数决策者（Acceptor）的承诺（Promise），紧接着他会携带编号（Proposal ID）发起Propose请求。Propose请求会携带一个提案内容（Proposal Value），由上一阶段决策者（Acceptor）返回的提案内容（Proposal Value）决定，如果上一阶段未返回，则自行决定一个提案内容（Proposal Value）。决策者（Acceptor）收到请求后作出Accepet应答。本阶段决策者（Acceptor）会作出以下<strong>承诺</strong>：<ul>
<li><strong>接受（Accepet）第一次收到的Proposal中的Value</strong></li>
<li><strong>不再应答编号（Proposal ID）小于当前请求的其他Accept Request。</strong></li>
</ul>
</li>
<li><strong>Learn阶段</strong> 当提议者（Proposer）收到超过半数决策者（Acceptor）的Accepet应答后，标识提案已经达成一致的的决议，学习者（Learner）收到决议并学习。</li>
</ol>
<p>&emsp;&emsp;把上面的三个阶段用表格画成更具体的步骤：</p>
<table>
<thead>
<tr>
<th style="text-align:center">步骤</th>
<th style="text-align:center">Proposer</th>
<th style="text-align:center">Acceptor</th>
<th style="text-align:center">Learn</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">生成一个编号N，携带N向集群中所有Acceptor发起Prepare请求</td>
<td style="text-align:center">1.如果编号N&gt;MaxProposalID：使MaxProposalID=N，回复Promise（AcceptedProposalID，AcceptedValue）</td>
<td style="text-align:center">无</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">收到过半数Acceptor的Promise回复：如果收到了AcceptedValue，使用AcceptedProposalID最大的AcceptedValue，否则自己选择一个值，发起Accept（N, Value）请求到所有Acceptor</td>
<td style="text-align:center">如果N&gt;=MaxProposalID：使AcceptedProposalID=N，MaxProposalID=N ，AcceptedValue=value；返回应答（MaxProposalID）</td>
<td style="text-align:center">无</td>
</tr>
<tr>
<td style="text-align:center">3</td>
<td style="text-align:center">Accept（N, Value）请求收到过半数应答，如果返回的MaxProposalID&gt;N，则跳到步骤1重新发起Prepare请求</td>
<td style="text-align:center">无</td>
<td style="text-align:center">无</td>
</tr>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">Accept（N, Value）请求收到过半数Accept应答（应答返回MaxProposalID&lt;=N），提案达成一致，发给所有Learner</td>
<td style="text-align:center">无</td>
<td style="text-align:center">学习</td>
</tr>
</tbody>
</table>
<p>&emsp;&emsp;这里我想到一个问题，为什么Paxos算法需要Prepare阶段？所有提议者（Proposer）直接发起Accept请求提交提案不行吗？在上面的决议流程下当然不行，为了避免多次提案而出现多个决议，那么必然要保证决策者（Acceptor）只能接受（Accept）一个提案，这样就会导致提议者（Proposer）很难获得半数以上的Accept应答。这也是违背活性（Liveness）原则的。</p>
<h4 id="活锁（Livelock）"><a href="#活锁（Livelock）" class="headerlink" title="活锁（Livelock）"></a>活锁（Livelock）</h4><p>&emsp;&emsp;在上面第三个步骤，Accept请求返回过半数应答，如果发现有返回应答的MaxProposalID&gt;N，则会跳到步骤1重新发起Prepare请求。可以用下面一个例子来说明活锁问题是如何产生的：<br><img src="http://ww1.sinaimg.cn/large/639cfad5gy1g4azkh3ys5j20ts0cqn1q.jpg" alt><br>S1到S5为决策者（Acceptor），P3.1指的是机器号为1时间戳为3的Prepare请求，A3.1X指的是Accept请求，X为该请求携带的提案内容。</p>
<ol>
<li>某时刻P3.1发起Prepare请求获得了多数应答，发起A3.1X的请求。S1、S2都已经成功应答了A3.1X的请求，但是S3机器由于已经应答了P3.5的请求，此时应答会返回MaxProposalID=3.5，大于A3.1X的3.1序列号，此时A3.1X会重新发起Prepare请求，如上图重新发起了P4.1请求。</li>
<li>同理，P3.5也成功获取了超过半数的Prepare应答，转而发起A3.5Y的提案，并且S4、S5已经成功应答了A3.5Y的请求，但是S3已经收到了P4.1的请求，所以此时A3.5Y请求会收到更大的序列号，然后重新发起Prepare为P5.5的请求。</li>
<li>可以看到提议者1和5会交替发起Prepare和Accept请求，这就是Paxos活锁问题的来源。</li>
</ol>
<p>&emsp;&emsp;那么应该如何解决活锁问题？第一种方案是发起请求的时候设置一个随机的延迟时间，尽可能让其中一个提议者完成整个决议；第二种方案是选举一出个Leader，只有Leader才能发起Accept请求，这样就彻底解决了活锁问题，这也是<strong>Multi-Paxos</strong>区别于Basic Paxos的地方。</p>

      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/分布式/" rel="tag"># 分布式</a>
          
        </div>
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2019/06/04/拥抱Docker（二）Dockerfile制作镜像/" rel="next" title="拥抱Docker（二）Dockerfile制作镜像">
                <i class="fa fa-chevron-left"></i> 拥抱Docker（二）Dockerfile制作镜像
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2019/06/28/谈谈Spring的IoC之循环依赖/" rel="prev" title="谈谈Spring的IoC之循环依赖">
                谈谈Spring的IoC之循环依赖 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          

  
    <div class="comments" id="comments">
      <div id="disqus_thread">
        <noscript>
          Please enable JavaScript to view the
          <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a>
        </noscript>
      </div>
    </div>

  



        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview-wrap sidebar-panel">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <p class="site-author-name" itemprop="name">matrix</p>
              <p class="site-description motion-element" itemprop="description"></p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/archives">
              
                  <span class="site-state-item-count">47</span>
                  <span class="site-state-item-name">日志</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-categories">
                <a href="/categories/index.html">
                  <span class="site-state-item-count">18</span>
                  <span class="site-state-item-name">分类</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-tags">
                
                  <span class="site-state-item-count">19</span>
                  <span class="site-state-item-name">标签</span>
                
              </div>
            

          </nav>

          

          

          
          

          
          

          

        </div>
      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-3"><a class="nav-link" href="#一致性"><span class="nav-number">1.</span> <span class="nav-text">一致性</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#共识"><span class="nav-number">2.</span> <span class="nav-text">共识</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Paxos"><span class="nav-number">3.</span> <span class="nav-text">Paxos</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#角色"><span class="nav-number">3.1.</span> <span class="nav-text">角色</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#三阶段"><span class="nav-number">3.2.</span> <span class="nav-text">三阶段</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#活锁（Livelock）"><span class="nav-number">3.3.</span> <span class="nav-text">活锁（Livelock）</span></a></li></ol></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; <span itemprop="copyrightYear">2021</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">matrix</span>

  
</div>


  <div class="powered-by">由 <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a> 强力驱动</div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">主题 &mdash; <a class="theme-link" target="_blank" href="https://github.com/iissnan/hexo-theme-next">NexT.Pisces</a> v5.1.4</div>
<div class=BbeiAn-info">
  浙ICP备 -
  <a href="http://www.beian.miit.gov.cn">18040498号</a>
  </a>
</div>




        







        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.4"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.4"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=5.1.4"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=5.1.4"></script>



  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.4"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.4"></script>



  


  

    
      <script id="dsq-count-scr" src="https://luyun.disqus.com/count.js" async></script>
    

    
      <script type="text/javascript">
        var disqus_config = function () {
          this.page.url = 'http://yoursite.com/2019/06/24/分布式共识算法之Paxos/';
          this.page.identifier = '2019/06/24/分布式共识算法之Paxos/';
          this.page.title = '分布式共识算法之Paxos';
        };
        var d = document, s = d.createElement('script');
        s.src = 'https://luyun.disqus.com/embed.js';
        s.setAttribute('data-timestamp', '' + +new Date());
        (d.head || d.body).appendChild(s);
      </script>
    

  




	





  














  





  

  

  

  
  

  

  

  

</body>
</html>
